﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using produccion.reportes;
using System.Windows.Controls.Primitives;
using System.Threading;
using System.Globalization;
using System.Collections;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmResumenDeCompras.xaml
    /// </summary>
    public partial class FrmResumenDeCompras : Window
    {
        #region FJRF - Variables del formulario
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta, DtImprimir, DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsImprimir;//FJRF - Para Imprimir los datos

        DataTable DtNivle1DeCaracteres3;//FJRF - Usamos este DataTable para hacer consultas de nivel 1
        DataTable DtNivle2DeCaracteres6;//FJRF - Usamos este DataTable para hacer consultas de nivel 2
        DataTable DtNivle3DeCaracteres9;//FJRF - Usamos este DataTable para hacer consultas de nivel 3
        DataTable DtNivle4DeCaracteres12;//FJRF - Usamos este DataTable para hacer consultas de nivel 4
        DataTable DtNivle5DeCaracteres15;//FJRF - Usamos este DataTable para hacer consultas de nivel 5

        DataTable DtResumenDeCompras;//FJRF - Resumen de compras 
        DataTable DtResumenDeComprasArmado;//FJRF - Resumen de compras armado

        String StrCodigoNivle1DeCaracteres3 = "";//FJRF - Usamos para hacer consultas de nivel 1
        String StrCodigoNivle2DeCaracteres6 = "";//FJRF - Usamos para hacer consultas de nivel 2
        String StrCodigoNivle3DeCaracteres9 = "";//FJRF - Usamos para hacer consultas de nivel 3
        String StrCodigoNivle4DeCaracteres12 = "";//FJRF - Usamos para hacer consultas de nivel 4
        String StrCodigoNivle5DeCaracteres15 = "";//FJRF - Usamos para hacer consultas de nivel 5

        String StrComodinNivle1DeCaracteres3 = "";//FJRF - Usamos para hacer comodin de nivel 1
        String StrComodinNivle2DeCaracteres6 = "        ";//FJRF - Usamos para hacer comodin de nivel 2
        String StrComodinNivle3DeCaracteres9 = "                ";//FJRF - Usamos para hacer comodin de nivel 3
        String StrComodinNivle4DeCaracteres12 = "                       ";//FJRF - Usamos para hacer comodin de nivel 4
        String StrComodinNivle5DeCaracteres15 = "                               ";//FJRF - Usamos para hacer comodin de nivel 5

        //String StrComodinNivle1DeCaracteres3 = " ¬ ";//FJRF - Usamos para hacer comodin de nivel 1
        //String StrComodinNivle2DeCaracteres6 = " ** ";//FJRF - Usamos para hacer comodin de nivel 2
        //String StrComodinNivle3DeCaracteres9 = " °°° ";//FJRF - Usamos para hacer comodin de nivel 3
        //String StrComodinNivle4DeCaracteres12 = " ---- ";//FJRF - Usamos para hacer comodin de nivel 4
        //String StrComodinNivle5DeCaracteres15 = " ->->-> ";//FJRF - Usamos para hacer comodin de nivel 5


        Boolean BooGridArmado = false;//FJRF - Para saber si el grid es armado o no
        Boolean BooGridArmadoActual = false;//FJRF - Para saber si el grid es armado o no

        DateTime DttFecha, DttFechaInicial, DttFechaFinal;//FJRF - Para el manejo de fechas
        #endregion

        public FrmResumenDeCompras()
        {
            InitializeComponent();
        }

        #region FJRF - EVENTOS DEL FORMULARIO
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            #region FJRF - Titulo ventana formulario
            string strTituloVentana = "RESUMEN DE COMPRAS" + " - Usuario:" + MDOgeneral.usuario + " - [FrmResumenDeCompras]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana
            #endregion

            #region FJRF - Establecemos las fechas iniciales
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            DttFecha = DateTime.Now;//FJRF - ponemos la fecha actual del sistema
            DttFechaInicial = DttFecha.AddDays(-30);//FJRF - Establecemos la fecha inicial treintadias antes de la fecha actual
            DttFechaFinal = DttFecha;//FJRF - la fecha final le ponemos la fecha actual

            DtpFechaInicial.SelectedDate = DttFechaInicial;//FJRF - Asignamos la fecha 
            DtpFechaFinal.SelectedDate = DttFechaFinal;//FJRF - Asignamos la fecha 
            #endregion

            #region FJRF - Quitamos los estilos a los objetos que se necesite controlar el foco
            CboCodigoProveedor.Style = null;//FJRF - quitamos el estilo que tenga
            CboNombreProveedor.Style = null;//FJRF - quitamos el estilo que tenga

            DtpFechaInicial.Style = null;//FJRF - quitamos el estilo que tenga
            DtpFechaFinal.Style = null;//FJRF - quitamos el estilo que tenga

            BtnProcesar.Style = null;//FJRF - quitamos el estilo que tenga
            #endregion

            #region FJRF - Carga proveedor
            //FJRF - CARGAMOS EL CODIGO DEL PROVEEDOR POR APARTE
            StrConsulta = "SELECT UPPER(CODPRV_PRV) AS CODPRV_PRV, UPPER(NOMPRV_PRV) AS NOMPRV_PRV FROM MAEPRVP ORDER BY NOMPRV_PRV";//FJRF - Armamos la consulta
            CargarCombo(CboCodigoProveedor, StrConsulta, "CODPRV_PRV", "CODPRV_PRV", "Codigo");//FJRF - Cargamos el combo

            //FJRF - CARGAMOS EL NOMBRE DEL PROVEEDOR POR APARTE
            CargarCombo(CboNombreProveedor, StrConsulta, "CODPRV_PRV", "NOMPRV_PRV", "Nombre");//FJRF - Cargamos el combo con la misma consulta anterior
            #endregion

            CboCodigoProveedor.Focus();//FJRF - Ponemos el foco en el objeto
        }
        private void CboCodigoProveedor_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.IsLoaded == true)//FJRF - Si el formulario esta cargado hacemos lo siguiente
            {
                CboNombreProveedor.SelectedIndex = CboCodigoProveedor.SelectedIndex;//FJRF - Igualamos los datos del codigo con el del nombre
                PttV_LimpiarDatos();//FJRF - Limpiamos los datos
            }
        }
        private void CboNombreProveedor_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.IsLoaded == true)//FJRF - Si el formulario esta cargado hacemos lo siguiente
            {
                CboCodigoProveedor.SelectedIndex = CboNombreProveedor.SelectedIndex;//FJRF - Igualamos los datos del codigo con el del nombre
                PttV_LimpiarDatos();//FJRF - Limpiamos los datos
            }
        }
        private void CboCodigoProveedor_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                CboNombreProveedor.Focus();//FJRF - Se envia el foco a este objeto
            }
        }
        private void CboNombreProveedor_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                DtpFechaInicial.Focus();//FJRF - Se envia el foco a este objeto
            }
        }
        private void BtnBuscarProveedor_Click(object sender, RoutedEventArgs e)
        {
            String StrDatoRetornado = StrCargarAyudasGenericasProveedores("PROVEEDOR");//FJRF - Cargamos la ayuda generica de los proveedores

            if (String.IsNullOrEmpty(StrDatoRetornado) == false)//FJRF - Si trae algun dato hacemos lo siguiente
            {
                string strDato = "";
                int IntPosicion = 0;
                foreach (var item in CboNombreProveedor.Items)
                {
                    strDato = ((DataRowView)item)[1].ToString();

                    if (strDato.ToUpper().Trim() == StrDatoRetornado.ToUpper().Trim())
                    {
                        break;
                    }
                    IntPosicion++;
                }
                CboNombreProveedor.SelectedIndex = IntPosicion;
            }
        }
        private void DtpFechaInicial_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                DtpFechaFinal.Focus();
            }
        }
        private void DtpFechaFinal_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                BtnProcesar.Focus();
            }
        }
        private void DtgDatosConsultados_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "CANTIDAD" || strNombreColumna == "COSTO")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.00}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgDatosConsultados_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            BooGridArmado = true;//FJRF - Decimos que este grid si es el armado esto se usa para pintar o no el grid segun sus niveles
            BooGridArmadoActual = true;//FJRF - Es el grid actual

            String StrCodigo = "";//FJRF - Variable que manejara el codigo
            if (DtgDatosConsultados.SelectedItem == null)//FJRF - Si no hay materiales seleccionados hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else//FJRF - Si hay datos hacemos lo siguiente
            {
                DataRowView dr = DtgDatosConsultados.SelectedItem as DataRowView;//FJRF - Creamos un DataRowView con el item seleccionado
                DataRow DrDatosConsultados = dr.Row;//FJRF - Cargamos las filas que tenga

                StrCodigo = Convert.ToString(DrDatosConsultados.ItemArray[0]);//FJRF - Traemos los datos seleccionados en las columnas que se necesitan

                #region FJRF - Asignamos el nivel seleccionado
                if (StrCodigo.Length == 3)//FJRF - Si el nivel es el nivel (1) hacemos lo siguiente
                {
                    PttV_AgregarNivel(StrCodigoNivle1DeCaracteres3, StrCodigo, 1);//FJRF - Asginamos el nuevo nivel seleccionado
                }
                if (StrCodigo.Length == 6)//FJRF - Si el nivel es el nivel (2) hacemos lo siguiente
                {
                    PttV_AgregarNivel(StrCodigoNivle2DeCaracteres6, StrCodigo, 2);//FJRF - Asginamos el nuevo nivel seleccionado
                }
                if (StrCodigo.Length == 9)//FJRF - Si el nivel es el nivel (3) hacemos lo siguiente
                {
                    PttV_AgregarNivel(StrCodigoNivle3DeCaracteres9, StrCodigo, 3);//FJRF - Asginamos el nuevo nivel seleccionado
                }
                if (StrCodigo.Length == 12)//FJRF - Si el nivel es el nivel (4) hacemos lo siguiente
                {
                    PttV_AgregarNivel(StrCodigoNivle4DeCaracteres12, StrCodigo, 4);//FJRF - Asginamos el nuevo nivel seleccionado
                }
                if (StrCodigo.Length == 15)//FJRF - Si el nivel es el nivel (5) hacemos lo siguiente
                {
                    PttV_AgregarNivel(StrCodigoNivle5DeCaracteres15, StrCodigo, 5);//FJRF - Asginamos el nuevo nivel seleccionado
                }
                #endregion
            }
        }
        private void DtgDatosConsultados_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            try
            {
                if (BooGridArmado == true)
                {
                    String StrCodigoNivel = "";//FJRF - Para saber que dato trae la fila
                    int IntLengthDelCodigo = 0;//FJRF - Para saber la cantidad de caracteres que tiene el codigo

                    StrCodigoNivel = ((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[0].ToString();//FJRF - Extraemos el codigo
                    IntLengthDelCodigo = StrCodigoNivel.Trim().Length;//FJRF - Extraemos la cantidad de caracteres que tiene el codigo

                    if (IntLengthDelCodigo == 3)//FJRF - Si el tamaño del codigo es de esta longitud hacemo lo siguiente
                    {
                        e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFD8BFD8"));//FJRF - Pintamos el nivel tres
                    }
                    if (IntLengthDelCodigo == 6)//FJRF - Si el tamaño del codigo es de esta longitud hacemo lo siguiente
                    {
                        e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFFFFFFF"));//FJRF - Pintamos el nivel tres
                    }
                    if (IntLengthDelCodigo == 9)//FJRF - Si el tamaño del codigo es de esta longitud hacemo lo siguiente
                    {
                        e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFFAEBD7"));//FJRF - Pintamos el nivel tres
                    }
                    if (IntLengthDelCodigo == 12)//FJRF - Si el tamaño del codigo es de esta longitud hacemo lo siguiente
                    {
                        e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FF87CEFA"));//FJRF - Pintamos el nivel tres
                    }
                    if (IntLengthDelCodigo == 15)//FJRF - Si el tamaño del codigo es de esta longitud hacemo lo siguiente
                    {
                        e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFAFEEEE"));//FJRF - Pintamos el nivel tres
                    }
                }
            }
            catch
            {
            }
        }
        private void DtpFechaInicial_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            PttV_LimpiarDatos();//FJRF - Limpiamos los datos
        }
        private void DtpFechaFinal_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            PttV_LimpiarDatos();//FJRF - Limpiamos los datos
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Procesar();//FJRF - Procesamos los datos
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            PttV_Imprimir();//FJRF - Imprimimos los datos en pantalla
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Nos salimos
        }
        #endregion

        #region FJRF - PROCESOS Y FUNCIONES DEL FORMULARIO

        #region FJRF - CargarCombosDejandoUnEspacioEnBlanco
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion

        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region FJRF - ParaRetornarElValorDeUnaCeldaDeUnDataGrid
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar

            if (row == null)
            {
                strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
            }
            else
            {
                TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

                if (cellContent == null)
                {
                    strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
                }
                else
                {
                    strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto
                }
            }
            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        #endregion

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        protected void PttV_LimpiarDatos()
        {
            DtgDatosConsultados.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtgDatosConsultados.Items.Clear();//FJRF - Quitamos los elementos de grid
        }
        private String StrCargarAyudasGenericasProveedores(String StrDatoQueDebeRetornar)
        {
            String StrDatoRetornado = "";//FJRF - Variable para saber el dato retornado

            FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
            FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE PROVEEDORES";//FJRF - Le enviamos un titulo personalizado al formulario

            StrConsulta = "SELECT ";//FJRF - Seleccionamos
            StrConsulta = StrConsulta + "UPPER(CODPRV_PRV) AS CODIGO,  UPPER(NOMPRV_PRV) AS PROVEEDOR,  NITPRV_PRV AS NIT,   UPPER(DIRPRV_PRV) AS DIRECCION,  UPPER(NOMCIU_CIU) AS CIUDAD,  TELPRV_PRV AS TELEFONO,  FAXPRV_PRV AS FAX,  UPPER(REPPRV_PRV) AS REPRESENTANTE,  UPPER(EMAIL_PRV) AS EMAIL ";//FJRF - Los campos
            StrConsulta = StrConsulta + "FROM MAEPRVP, MAECIU ";//FJRF - Las tablas
            StrConsulta = StrConsulta + "WHERE CODCIU_PRV = CODCIU_CIU AND ESTADO_PRV = 'A' ";//FJRF - Condicionamos la consulta
            StrConsulta = StrConsulta + "ORDER BY NOMPRV_PRV ";//FJRF - Ordenamos la información

            FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
            FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODIGO";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene

            FrmAyudas.pIntNumeroColumnasAInmovilizarGrid_Opcional = 2;//FJRF - Decimos que inmobilice las 2 primeras filas

            if (StrDatoQueDebeRetornar == "CODIGO")//FJRF - Decimos porque dato quiere buscar
            {
                FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "CODIGO";//FJRF - Asignamos el dato a buscar
            }
            else//FJRF - Si no es por codico entonces sera por proveedor en este caso
            {
                FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "PROVEEDOR";//FJRF - Asignamos el dato a buscar
            }

            FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario

            if (FrmAyudas.DtDatosRetornados == null)//FJRF - Si no trae nada hacemos lo siguiente
            {
                StrDatoRetornado = "";//FJRF - Retornamos vacio
            }
            else//FJRF - Si trae datos entonces hacemos lo siguiente
            {
                if (FrmAyudas.DtDatosRetornados.Rows.Count > 0)//FJRF - Si el objeto trae filas entonces hacemos lo siguiente
                {
                    StrDatoRetornado = FrmAyudas.DtDatosRetornados.Rows[0][StrDatoQueDebeRetornar].ToString();//FJRF - Buscamos el dato seleccionado;
                }
                else//FJRF - Si no es nulo pero no trae filas hacemos lo siguiente
                {
                    StrDatoRetornado = "";//FJRF - Retornamos vacio
                }
            }
            return StrDatoRetornado;////FJRF - Rerornamos el dato que se necesita
        }
        protected void PttV_Procesar()
        {
            BooGridArmado = false;//FJRF - Decimos que este grid no es el armado esto se usa para pintar o no el grid segun sus niveles
            BooGridArmadoActual = false;//FJRF - Es el grid actual

            StrCodigoNivle1DeCaracteres3 = "";//FJRF - Limpiamos las variables
            StrCodigoNivle2DeCaracteres6 = "";//FJRF - Limpiamos las variables
            StrCodigoNivle3DeCaracteres9 = "";//FJRF - Limpiamos las variables
            StrCodigoNivle4DeCaracteres12 = "";//FJRF - Limpiamos las variables
            StrCodigoNivle5DeCaracteres15 = "";//FJRF - Limpiamos las variables

            String StrCodigoProveedorInicial, StrCodigoProveedorFinal, StrDato;//FJRF - Creamos el codigo inicial

            if (CboCodigoProveedor.SelectedValue == null)//FJRF - Si no trae nada hacemos lo siguiente
            {
                StrCodigoProveedorInicial = "   ";//FJRF - Enviamos un valor por defecto
                StrCodigoProveedorFinal = "zzz";//FJRF - Enviamos un valor por defecto
            }
            else//FJRF - Si trae datos hacemos lo siguiente
            {
                StrDato = CboCodigoProveedor.SelectedValue.ToString();//FJRF - Extraemos el valor
                if (StrDato == "ZZZ999" || StrDato == "TODOS")//FJRF - Si el valor equivale a todos entonces hacemos lo siguiente
                {
                    StrCodigoProveedorInicial = "   ";//FJRF - Enviamos un valor por defecto
                    StrCodigoProveedorFinal = "zzz";//FJRF - Enviamos un valor por defecto
                }
                else//FJRF - Si no equivale a todos entonces hacemos lo siguiente
                {
                    StrCodigoProveedorInicial = CboCodigoProveedor.SelectedValue.ToString();//FJRF - Asignamos el valor
                    StrCodigoProveedorFinal = CboCodigoProveedor.SelectedValue.ToString();//FJRF - Asignamos el valor
                }
            }

            DttFechaInicial = DtpFechaInicial.SelectedDate.Value;//FJRF - Asignamos la fecha inicial
            DttFechaFinal = DtpFechaFinal.SelectedDate.Value;//FJRF - Asignamos la fecha final

            EjecutarSp_RESUMENCOMPRAS(StrCodigoProveedorInicial, StrCodigoProveedorFinal, DttFechaInicial.ToShortDateString(), DttFechaFinal.ToShortDateString());//FJRF - Ejecutamos el SP

            DtgDatosConsultados.Columns[0].Visibility = Visibility.Hidden;//FJRF - Ocultamos la columnas del codigo
        }
        private void EjecutarSp_RESUMENCOMPRAS(string strCodigoProveedorInicial, string strCodigoProveedorFinal, string strFechaInicial, string strFechaFinal)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                #region FJRF - Ejecutamos el sp
                MDOgeneral.spComando.CommandText = "SP_RESUMENCOMPRAS";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_prvini", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strCodigoProveedorInicial;
                MDOgeneral.spComando.Parameters.Add("pva_prvfin", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strCodigoProveedorFinal;

                MDOgeneral.spComando.Parameters.Add("pdt_desde", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strFechaInicial;
                MDOgeneral.spComando.Parameters.Add("pdt_hasta", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = strFechaFinal;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
                #endregion

                #region FJRF - CreamosLasColmnasDelEncabezado
                DtgDatosConsultados.ItemsSource = null;//FJRF - Quitamos cualquier dato enlazado que tenga el objeto
                DtgDatosConsultados.Items.Clear();//FJRF - Limpiamos el grid

                DtResumenDeCompras = new DataTable("DtResumenDeCompras");//FJRF - Creamos la tabla que contendra el encabezado del informe

                //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
                DtResumenDeCompras.Columns.Add("CODIGO", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
                DtResumenDeCompras.Columns.Add("NOMBRE", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
                DtResumenDeCompras.Columns.Add("CANTIDAD", System.Type.GetType("System.Double"));//FJRF - Este es el nombre de la empresa
                DtResumenDeCompras.Columns.Add("COSTO", System.Type.GetType("System.Double"));//FJRF - Este es el nombre de la empresa

                DtResumenDeCompras.TableName = "DtResumenDeCompras";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
                #endregion

                #region FJRF - Cargamos los niveles en tablas
                StrConsulta = "SELECT CODIGO_TMP AS CODIGO, UPPER(NOMBRE_TMP) AS NOMBRE, CANTIDAD_TMP AS CANTIDAD, COSTO_TMP AS COSTO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM TMPRESCOM ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE LENGTH(TRIM(CODIGO_TMP)) = 3 ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY NOMBRE_TMP ";//FJRF - Armamos la consulta
                DtNivle1DeCaracteres3 = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos

                StrConsulta = "SELECT CODIGO_TMP AS CODIGO, UPPER(NOMBRE_TMP) AS NOMBRE, CANTIDAD_TMP AS CANTIDAD, COSTO_TMP AS COSTO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM TMPRESCOM ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE LENGTH(TRIM(CODIGO_TMP)) = 6 ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY NOMBRE_TMP ";//FJRF - Armamos la consulta
                DtNivle2DeCaracteres6 = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos

                StrConsulta = "SELECT CODIGO_TMP AS CODIGO, UPPER(NOMBRE_TMP) AS NOMBRE, CANTIDAD_TMP AS CANTIDAD, COSTO_TMP AS COSTO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM TMPRESCOM ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE LENGTH(TRIM(CODIGO_TMP)) = 9 ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY NOMBRE_TMP ";//FJRF - Armamos la consulta
                DtNivle3DeCaracteres9 = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos

                StrConsulta = "SELECT CODIGO_TMP AS CODIGO, UPPER(NOMBRE_TMP) AS NOMBRE, CANTIDAD_TMP AS CANTIDAD, COSTO_TMP AS COSTO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM TMPRESCOM ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE LENGTH(TRIM(CODIGO_TMP)) = 12 ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY NOMBRE_TMP ";//FJRF - Armamos la consulta
                DtNivle4DeCaracteres12 = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos

                StrConsulta = "SELECT CODIGO_TMP AS CODIGO, UPPER(NOMBRE_TMP) AS NOMBRE, CANTIDAD_TMP AS CANTIDAD, COSTO_TMP AS COSTO ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM TMPRESCOM ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE LENGTH(TRIM(CODIGO_TMP)) = 15 ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY NOMBRE_TMP ";//FJRF - Armamos la consulta
                DtNivle5DeCaracteres15 = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos
                #endregion


                if (DtNivle1DeCaracteres3.Rows.Count > 0)//FJRF - Si el nivel uno tiene datos hacemos lo siguiente
                {
                    DataRow drNivle1DeCaracteres3;//FJRF - Creamos un manejador de filas para el DataTable actual
                    drNivle1DeCaracteres3 = DtResumenDeCompras.NewRow();//FJRF - Agregamos una nueva fila

                    //FJRF - ASIGNAMOS LOS VALORES
                    drNivle1DeCaracteres3["CODIGO"] = DtNivle1DeCaracteres3.Rows[0][0].ToString();//FJRF - Enviamos los datos encontrados
                    drNivle1DeCaracteres3["NOMBRE"] = DtNivle1DeCaracteres3.Rows[0][1].ToString();//FJRF - Enviamos los datos encontrados
                    drNivle1DeCaracteres3["CANTIDAD"] = DtNivle1DeCaracteres3.Rows[0][2].ToString();//FJRF - Enviamos los datos encontrados
                    drNivle1DeCaracteres3["COSTO"] = DtNivle1DeCaracteres3.Rows[0][3].ToString();//FJRF - Enviamos los datos encontrados

                    DtResumenDeCompras.Rows.Add(drNivle1DeCaracteres3);//FJRF - Agregamos a la tabla el registro creado

                    //if (DtNivle2DeCaracteres6.Rows.Count > 0)//FJRF - Si el nivel dos tiene datos hacemos lo siguiente
                    //{
                    //    for (int IntFilaActual = 0; IntFilaActual < DtNivle2DeCaracteres6.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                    //    {
                    //        DataRow drNivle2DeCaracteres6;//FJRF - Creamos un manejador de filas para el DataTable actual
                    //        drNivle2DeCaracteres6 = DtResumenDeCompras.NewRow();//FJRF - Agregamos una nueva fila

                    //        //FJRF - ASIGNAMOS LOS VALORES
                    //        drNivle2DeCaracteres6["CODIGO"] = DtNivle2DeCaracteres6.Rows[IntFilaActual][0].ToString();//FJRF - Enviamos los datos encontrados
                    //        drNivle2DeCaracteres6["NOMBRE"] = DtNivle2DeCaracteres6.Rows[IntFilaActual][1].ToString();//FJRF - Enviamos los datos encontrados
                    //        drNivle2DeCaracteres6["CANTIDAD"] = DtNivle2DeCaracteres6.Rows[IntFilaActual][2].ToString();//FJRF - Enviamos los datos encontrados
                    //        drNivle2DeCaracteres6["COSTO"] = DtNivle2DeCaracteres6.Rows[IntFilaActual][3].ToString();//FJRF - Enviamos los datos encontrados

                    //        DtResumenDeCompras.Rows.Add(drNivle2DeCaracteres6);//FJRF - Agregamos a la tabla el registro creado
                    //    }
                    //}
                }
                DtgDatosConsultados.ItemsSource = DtResumenDeCompras.DefaultView;//FJRF - Visualizamos los datos
            }
            catch (Exception ex)
            {
                Msgbox("PROCESO CANCELADO",ex.Message.ToString(),MessageBoxButton.OK,MessageBoxImage.Error);
            }
        }
        protected void PttV_AgregarNivel(String StrNivel, String StrAgregarOQuitarNivel, int IntNivel)
        {
            String StrDatoNivelRecorrido = "";//FJRF - Se usa para extraer el dato del nivel recorrido y tomar las posiciones necesarias
            if (String.IsNullOrEmpty(StrNivel) == true)//FJRF - Si el nivel seleccionado no tiene datos enconces hacemos lo siguiente
            {
                #region FJRF - Asignamos el dato selecciondo por primera vez
                if (IntNivel == 1)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle1DeCaracteres3 = StrAgregarOQuitarNivel + ", ";//FJRF - Agregamos el nivel seleccionado
                }
                if (IntNivel == 2)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle2DeCaracteres6 = StrAgregarOQuitarNivel + ", ";//FJRF - Agregamos el nivel seleccionado
                }
                if (IntNivel == 3)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle3DeCaracteres9 = StrAgregarOQuitarNivel + ", ";//FJRF - Agregamos el nivel seleccionado
                }
                if (IntNivel == 4)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle4DeCaracteres12 = StrAgregarOQuitarNivel + ", ";//FJRF - Agregamos el nivel seleccionado
                }
                if (IntNivel == 5)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle5DeCaracteres15 = StrAgregarOQuitarNivel + ", ";//FJRF - Agregamos el nivel seleccionado
                }
                #endregion
            }
            else//FJRF - Pero si el nivel seleccionado tiene datos entonces hacemos lo siguiente
            {
                #region FJRF - Averiguamos si el nivel ya se selecciono o no
                Boolean BooElNivelExiste = false;//FJRF - Para saber si el nivel existe
                
                Boolean BooElNivelFueEliminado = false;//FJRF - Para saber si el nivel fue eliminado
                String StrCodigoNivelEliminado = "";//FJRF - Para saber el codigo del nivel que fue eliminado

                char[] chrSeparador = new char[] { ',' };//FJRF - Variable que va a contener el separador
                string[] strResultados;//FJRF - La cantidad de datos que se tienen
                String StrNivelSeleccionado = "";//FJRF - Nombre de la columna a la cual se le va a aplicar el formato

                strResultados = StrNivel.Split(chrSeparador, StringSplitOptions.None);//FJRF - Extraemos los datos
                foreach (string strDato in strResultados)//FJRF - Recorremos los datos enviados
                {
                    #region FJRF - Extraemos el nivel
                    if (String.IsNullOrEmpty(strDato) == false)//FJRF - Si retorna algun dato hacemos lo siguiente
                    {
                        StrNivelSeleccionado = strDato;//FJRF - Cargamos el nombre de la columna
                    }
                    else//FJRF - Si no tiene datos hacemos lo siguiente
                    {
                        StrNivelSeleccionado = "";//FJRF - Decimos que no hay datos
                    }
                    #endregion

                    if (String.IsNullOrEmpty(StrNivelSeleccionado) == false)//FJRF - Si hay datos hacemos lo siguiente
                    {
                        if (StrNivelSeleccionado.Trim() == StrAgregarOQuitarNivel.Trim())//FJRF - Miramos si el nivel ya esta seleccionado
                        {
                            BooElNivelExiste = true;//FJRF - Si el nivel ya esta seleccionado entonces informamos al sistema que si existe
                            break;//FJRF - Nos salimos porque ya sabemos que existe
                        }
                    }
                }
                #endregion

                #region FJRF - Agregamos o quitamos el nivel seleccionado
                if (BooElNivelExiste == true)//FJRF - Si el nivel existe entonces hacemos lo siguiente
                {
                    String StrNivelAQuitar = StrAgregarOQuitarNivel + ", ";//FJRF - Armamos el dato a quitar
                    String StrNuevaCadena = "";//FJRF - Donde quedara la nueva cadena

                    StrNuevaCadena = StrNivel.Replace(StrNivelAQuitar, "");//FJRF - Quitamos el nivel existente
                    StrNivel = StrNuevaCadena;//FJRF - Asignamos como quedara el nivel

                    BooElNivelFueEliminado = true;//FJRF - El dato fue eliminado
                    StrCodigoNivelEliminado = StrNivelAQuitar;//FJRF - Informamos cual dato se quito
                }
                else//FJRF - Si el nivel seleccionado no existe entonces hacemos lo siguiente
                {
                    StrNivel = StrNivel + StrAgregarOQuitarNivel + ", ";//FJRF - Agregamos el nivel nuevo

                    BooElNivelFueEliminado = false;//FJRF - El dato fue agregado
                }
                #endregion

                #region FJRF - Actualizamos los niveles agregados o quitados
                if (IntNivel == 1)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle1DeCaracteres3 = StrNivel;//FJRF - Remplazamos los datos con el nuevo nivel quitado o agregado
                }
                if (IntNivel == 2)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle2DeCaracteres6 = StrNivel;//FJRF - Remplazamos los datos con el nuevo nivel quitado o agregado
                }
                if (IntNivel == 3)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle3DeCaracteres9 = StrNivel;//FJRF - Remplazamos los datos con el nuevo nivel quitado o agregado
                }
                if (IntNivel == 4)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle4DeCaracteres12 = StrNivel;//FJRF - Remplazamos los datos con el nuevo nivel quitado o agregado
                }
                if (IntNivel == 5)//FJRF - Si es este nivel hacemos lo siguiente
                {
                    StrCodigoNivle5DeCaracteres15 = StrNivel;//FJRF - Remplazamos los datos con el nuevo nivel quitado o agregado
                }
                #endregion
            }

            //FJRF - Esto es para poner el color del grid de forma intercalada si no tiene datos como cuando recien se busca
            //if (String.IsNullOrEmpty(StrCodigoNivle1DeCaracteres3) == true && String.IsNullOrEmpty(StrCodigoNivle2DeCaracteres6) == true && String.IsNullOrEmpty(StrCodigoNivle3DeCaracteres9) == true && String.IsNullOrEmpty(StrCodigoNivle4DeCaracteres12) == true && String.IsNullOrEmpty(StrCodigoNivle5DeCaracteres15) == true)//FJRF - Si ninguna de las variables tiene datos hacemos lo siguiente
            //{
            //    BooGridArmado = false;//FJRF - al ponerlo en falso pondra el grid del estandar que se manaja 
            //}

            #region FJRF - Agregamos los datos al grid
            DtgDatosConsultados.ItemsSource = null;//FJRF - Quitamos cualquier dato enlazado que tenga el objeto
            DtgDatosConsultados.Items.Clear();//FJRF - Limpiamos el grid

            //FJRF - El armado
            DtResumenDeComprasArmado = new DataTable("DtResumenDeComprasArmado");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtResumenDeComprasArmado.Columns.Add("CODIGO", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtResumenDeComprasArmado.Columns.Add("NOMBRE", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtResumenDeComprasArmado.Columns.Add("CANTIDAD", System.Type.GetType("System.Double"));//FJRF - Este es el nombre de la empresa
            DtResumenDeComprasArmado.Columns.Add("COSTO", System.Type.GetType("System.Double"));//FJRF - Este es el nombre de la empresa

            DtResumenDeComprasArmado.TableName = "DtResumenDeComprasArmado";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet

            String StrNivel1Agregado, StrNivel2Agregado, StrNivel3Agregado, StrNivel4Agregado, StrNivel5Agregado;
            if (DtNivle1DeCaracteres3.Rows.Count > 0)//FJRF - Si el nivel uno tiene datos hacemos lo siguiente
            {
                DataRow drNivle1DeCaracteres3;//FJRF - Creamos un manejador de filas para el DataTable actual
                drNivle1DeCaracteres3 = DtResumenDeComprasArmado.NewRow();//FJRF - Agregamos una nueva fila

                //FJRF - ASIGNAMOS LOS VALORES
                StrNivel1Agregado = DtNivle1DeCaracteres3.Rows[0][0].ToString();//FJRF - Enviamos los datos encontrados

                drNivle1DeCaracteres3["CODIGO"] = StrNivel1Agregado;//FJRF - Enviamos los datos encontrados
                drNivle1DeCaracteres3["NOMBRE"] = StrComodinNivle1DeCaracteres3 + DtNivle1DeCaracteres3.Rows[0][1].ToString();//FJRF - Enviamos los datos encontrados
                drNivle1DeCaracteres3["CANTIDAD"] = DtNivle1DeCaracteres3.Rows[0][2].ToString();//FJRF - Enviamos los datos encontrados
                drNivle1DeCaracteres3["COSTO"] = DtNivle1DeCaracteres3.Rows[0][3].ToString();//FJRF - Enviamos los datos encontrados

                DtResumenDeComprasArmado.Rows.Add(drNivle1DeCaracteres3);//FJRF - Agregamos a la tabla el registro creado

                #region FJRF - Nuevo nivel
                if (String.IsNullOrEmpty(StrCodigoNivle1DeCaracteres3.Trim()) == false)//FJRF - Si el nivel tres tiene datos hacemos lo siguiente
                {
                    if (DtNivle2DeCaracteres6.Rows.Count > 0)//FJRF - Si el nivel dos tiene datos hacemos lo siguiente
                    {
                        for (int IntFilaActual = 0; IntFilaActual < DtNivle2DeCaracteres6.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                        {
                            DataRow drNivle2DeCaracteres6;//FJRF - Creamos un manejador de filas para el DataTable actual
                            drNivle2DeCaracteres6 = DtResumenDeComprasArmado.NewRow();//FJRF - Agregamos una nueva fila

                            //FJRF - ASIGNAMOS LOS VALORES
                            StrNivel2Agregado = DtNivle2DeCaracteres6.Rows[IntFilaActual][0].ToString();//FJRF - Enviamos los datos encontrados

                            drNivle2DeCaracteres6["CODIGO"] = StrNivel2Agregado;//FJRF - Enviamos los datos encontrados
                            drNivle2DeCaracteres6["NOMBRE"] = StrComodinNivle2DeCaracteres6 + DtNivle2DeCaracteres6.Rows[IntFilaActual][1].ToString();//FJRF - Enviamos los datos encontrados
                            drNivle2DeCaracteres6["CANTIDAD"] = DtNivle2DeCaracteres6.Rows[IntFilaActual][2].ToString();//FJRF - Enviamos los datos encontrados
                            drNivle2DeCaracteres6["COSTO"] = DtNivle2DeCaracteres6.Rows[IntFilaActual][3].ToString();//FJRF - Enviamos los datos encontrados

                            DtResumenDeComprasArmado.Rows.Add(drNivle2DeCaracteres6);//FJRF - Agregamos a la tabla el registro creado

                            #region FJRF - Nuevo nivel
                            if (String.IsNullOrEmpty(StrCodigoNivle2DeCaracteres6.Trim()) == false)//FJRF - Si el nivel tres tiene datos hacemos lo siguiente
                            {
                                #region FJRF - Recorremos el nivel 2 y agregamos los datos que coincidan

                                char[] chrSeparador = new char[] { ',' };//FJRF - Variable que va a contener el separador
                                string[] strResultados;//FJRF - La cantidad de datos que se tienen
                                String StrDatoRecorridoNivel2 = "";//FJRF - Nombre de la columna a la cual se le va a aplicar el formato

                                strResultados = StrCodigoNivle2DeCaracteres6.Split(chrSeparador, StringSplitOptions.None);//FJRF - Extraemos los datos
                                foreach (string strDato in strResultados)//FJRF - Recorremos los datos enviados
                                {
                                    #region FJRF - Extraemos el nivel
                                    if (String.IsNullOrEmpty(strDato) == false)//FJRF - Si retorna algun dato hacemos lo siguiente
                                    {
                                        StrDatoRecorridoNivel2 = strDato.Trim();//FJRF - Cargamos el nombre de la columna
                                    }
                                    else//FJRF - Si no tiene datos hacemos lo siguiente
                                    {
                                        StrDatoRecorridoNivel2 = "";//FJRF - Decimos que no hay datos
                                    }
                                    #endregion

                                    if (String.IsNullOrEmpty(StrDatoRecorridoNivel2) == false)//FJRF - Si hay datos hacemos lo siguiente
                                    {
                                        #region FJRF - Agregamos los datos
                                        for (int IntFilaActualNivel3 = 0; IntFilaActualNivel3 < DtNivle3DeCaracteres9.Rows.Count; IntFilaActualNivel3++)//FJRF - Recorremos la informacion encontrada
                                        {
                                            StrDatoNivelRecorrido = DtNivle3DeCaracteres9.Rows[IntFilaActualNivel3][0].ToString().Substring(0, 6);//FJRF - extraemos los datos encontrados

                                            if (StrDatoNivelRecorrido.Trim() == StrNivel2Agregado.Trim())//FJRF - Si el nivel es igual al nivel agregado hacemos lo siguiente
                                            {
                                                if (StrDatoNivelRecorrido.Trim() == StrDatoRecorridoNivel2.Trim())//FJRF - Si el dato recorrido es igual al nivel recorrido hacemo lo siguiente
                                                {
                                                    DataRow drNivle3DeCaracteres9;//FJRF - Creamos un manejador de filas para el DataTable actual
                                                    drNivle3DeCaracteres9 = DtResumenDeComprasArmado.NewRow();//FJRF - Agregamos una nueva fila

                                                    //FJRF - ASIGNAMOS LOS VALORES
                                                    StrNivel3Agregado = DtNivle3DeCaracteres9.Rows[IntFilaActualNivel3][0].ToString();//FJRF - Enviamos los datos encontrados

                                                    drNivle3DeCaracteres9["CODIGO"] = StrNivel3Agregado;//FJRF - Enviamos los datos encontrados
                                                    drNivle3DeCaracteres9["NOMBRE"] = StrComodinNivle3DeCaracteres9 + DtNivle3DeCaracteres9.Rows[IntFilaActualNivel3][1].ToString();//FJRF - Enviamos los datos encontrados
                                                    drNivle3DeCaracteres9["CANTIDAD"] = DtNivle3DeCaracteres9.Rows[IntFilaActualNivel3][2].ToString();//FJRF - Enviamos los datos encontrados
                                                    drNivle3DeCaracteres9["COSTO"] = DtNivle3DeCaracteres9.Rows[IntFilaActualNivel3][3].ToString();//FJRF - Enviamos los datos encontrados

                                                    DtResumenDeComprasArmado.Rows.Add(drNivle3DeCaracteres9);//FJRF - Agregamos a la tabla el registro creado

                                                    #region FJRF - Nuevo nivel
                                                    if (String.IsNullOrEmpty(StrCodigoNivle3DeCaracteres9.Trim()) == false)//FJRF - Si el nivel tres tiene datos hacemos lo siguiente
                                                    {
                                                        #region FJRF - Recorremos el nivel 3 y agregamos los datos que coincidan

                                                        char[] chrSeparador3 = new char[] { ',' };//FJRF - Variable que va a contener el separador
                                                        string[] strResultados3;//FJRF - La cantidad de datos que se tienen
                                                        String StrDatoRecorridoNivel3 = "";//FJRF - Nombre de la columna a la cual se le va a aplicar el formato

                                                        strResultados3 = StrCodigoNivle3DeCaracteres9.Split(chrSeparador3, StringSplitOptions.None);//FJRF - Extraemos los datos
                                                        foreach (string strDato3 in strResultados3)//FJRF - Recorremos los datos enviados
                                                        {
                                                            #region FJRF - Extraemos el nivel
                                                            if (String.IsNullOrEmpty(strDato3) == false)//FJRF - Si retorna algun dato hacemos lo siguiente
                                                            {
                                                                StrDatoRecorridoNivel3 = strDato3.Trim();//FJRF - Cargamos el nombre de la columna
                                                            }
                                                            else//FJRF - Si no tiene datos hacemos lo siguiente
                                                            {
                                                                StrDatoRecorridoNivel3 = "";//FJRF - Decimos que no hay datos
                                                            }
                                                            #endregion

                                                            if (String.IsNullOrEmpty(StrDatoRecorridoNivel3) == false)//FJRF - Si hay datos hacemos lo siguiente
                                                            {
                                                                #region FJRF - Agregamos los datos
                                                                for (int IntFilaActualNivel4 = 0; IntFilaActualNivel4 < DtNivle4DeCaracteres12.Rows.Count; IntFilaActualNivel4++)//FJRF - Recorremos la informacion encontrada
                                                                {
                                                                    StrDatoNivelRecorrido = DtNivle4DeCaracteres12.Rows[IntFilaActualNivel4][0].ToString().Substring(0, 9);//FJRF - extraemos los datos encontrados

                                                                    if (StrDatoNivelRecorrido.Trim() == StrNivel3Agregado.Trim())//FJRF - Si el nivel es igual al nivel agregado hacemos lo siguiente
                                                                    {
                                                                        if (StrDatoNivelRecorrido.Trim() == StrDatoRecorridoNivel3.Trim())//FJRF - Si el dato recorrido es igual al nivel recorrido hacemo lo siguiente
                                                                        {
                                                                            DataRow drNivle4DeCaracteres12;//FJRF - Creamos un manejador de filas para el DataTable actual
                                                                            drNivle4DeCaracteres12 = DtResumenDeComprasArmado.NewRow();//FJRF - Agregamos una nueva fila

                                                                            //FJRF - ASIGNAMOS LOS VALORES
                                                                            StrNivel4Agregado = DtNivle4DeCaracteres12.Rows[IntFilaActualNivel4][0].ToString();//FJRF - Enviamos los datos encontrados

                                                                            drNivle4DeCaracteres12["CODIGO"] = StrNivel4Agregado;//FJRF - Enviamos los datos encontrados
                                                                            drNivle4DeCaracteres12["NOMBRE"] = StrComodinNivle4DeCaracteres12 + DtNivle4DeCaracteres12.Rows[IntFilaActualNivel4][1].ToString();//FJRF - Enviamos los datos encontrados
                                                                            drNivle4DeCaracteres12["CANTIDAD"] = DtNivle4DeCaracteres12.Rows[IntFilaActualNivel4][2].ToString();//FJRF - Enviamos los datos encontrados
                                                                            drNivle4DeCaracteres12["COSTO"] = DtNivle4DeCaracteres12.Rows[IntFilaActualNivel4][3].ToString();//FJRF - Enviamos los datos encontrados

                                                                            DtResumenDeComprasArmado.Rows.Add(drNivle4DeCaracteres12);//FJRF - Agregamos a la tabla el registro creado

                                                                            #region FJRF - Nuevo nivel
                                                                            if (String.IsNullOrEmpty(StrCodigoNivle4DeCaracteres12.Trim()) == false)//FJRF - Si el nivel tres tiene datos hacemos lo siguiente
                                                                            {
                                                                                #region FJRF - Recorremos el nivel 4 y agregamos los datos que coincidan

                                                                                char[] chrSeparador4 = new char[] { ',' };//FJRF - Variable que va a contener el separador
                                                                                string[] strResultados4;//FJRF - La cantidad de datos que se tienen
                                                                                String StrDatoRecorridoNivel4 = "";//FJRF - Nombre de la columna a la cual se le va a aplicar el formato

                                                                                strResultados4 = StrCodigoNivle4DeCaracteres12.Split(chrSeparador4, StringSplitOptions.None);//FJRF - Extraemos los datos
                                                                                foreach (string strDato4 in strResultados4)//FJRF - Recorremos los datos enviados
                                                                                {
                                                                                    #region FJRF - Extraemos el nivel
                                                                                    if (String.IsNullOrEmpty(strDato4) == false)//FJRF - Si retorna algun dato hacemos lo siguiente
                                                                                    {
                                                                                        StrDatoRecorridoNivel4 = strDato4.Trim();//FJRF - Cargamos el nombre de la columna
                                                                                    }
                                                                                    else//FJRF - Si no tiene datos hacemos lo siguiente
                                                                                    {
                                                                                        StrDatoRecorridoNivel4 = "";//FJRF - Decimos que no hay datos
                                                                                    }
                                                                                    #endregion

                                                                                    if (String.IsNullOrEmpty(StrDatoRecorridoNivel4) == false)//FJRF - Si hay datos hacemos lo siguiente
                                                                                    {
                                                                                        #region FJRF - Agregamos los datos
                                                                                        for (int IntFilaActualNivel5 = 0; IntFilaActualNivel5 < DtNivle5DeCaracteres15.Rows.Count; IntFilaActualNivel5++)//FJRF - Recorremos la informacion encontrada
                                                                                        {
                                                                                            StrDatoNivelRecorrido = DtNivle5DeCaracteres15.Rows[IntFilaActualNivel5][0].ToString().Substring(0, 12);//FJRF - extraemos los datos encontrados

                                                                                            if (StrDatoNivelRecorrido.Trim() == StrNivel4Agregado.Trim())//FJRF - Si el nivel es igual al nivel agregado hacemos lo siguiente
                                                                                            {
                                                                                                if (StrDatoNivelRecorrido.Trim() == StrDatoRecorridoNivel4.Trim())//FJRF - Si el dato recorrido es igual al nivel recorrido hacemo lo siguiente
                                                                                                {
                                                                                                    DataRow drNivle5DeCaracteres15;//FJRF - Creamos un manejador de filas para el DataTable actual
                                                                                                    drNivle5DeCaracteres15 = DtResumenDeComprasArmado.NewRow();//FJRF - Agregamos una nueva fila

                                                                                                    //FJRF - ASIGNAMOS LOS VALORES
                                                                                                    StrNivel5Agregado = DtNivle5DeCaracteres15.Rows[IntFilaActualNivel5][0].ToString();//FJRF - Enviamos los datos encontrados

                                                                                                    drNivle5DeCaracteres15["CODIGO"] = StrNivel5Agregado;//FJRF - Enviamos los datos encontrados
                                                                                                    drNivle5DeCaracteres15["NOMBRE"] = StrComodinNivle5DeCaracteres15 + DtNivle5DeCaracteres15.Rows[IntFilaActualNivel5][1].ToString();//FJRF - Enviamos los datos encontrados
                                                                                                    drNivle5DeCaracteres15["CANTIDAD"] = DtNivle5DeCaracteres15.Rows[IntFilaActualNivel5][2].ToString();//FJRF - Enviamos los datos encontrados
                                                                                                    drNivle5DeCaracteres15["COSTO"] = DtNivle5DeCaracteres15.Rows[IntFilaActualNivel5][3].ToString();//FJRF - Enviamos los datos encontrados

                                                                                                    DtResumenDeComprasArmado.Rows.Add(drNivle5DeCaracteres15);//FJRF - Agregamos a la tabla el registro creado
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                        #endregion
                                                                                    }
                                                                                }
                                                                                #endregion
                                                                            }
                                                                            #endregion
                                                                        }
                                                                    }
                                                                }
                                                                #endregion
                                                            }
                                                        }
                                                        #endregion
                                                    }
                                                    #endregion
                                                }
                                            }
                                        }
                                        #endregion
                                    }
                                }
                                #endregion
                            }
                            #endregion
                        }
                    }
                }
                #endregion
            }
            DtgDatosConsultados.ItemsSource = DtResumenDeComprasArmado.DefaultView;//FJRF - Asignamos los nuevos datos
            #endregion

            DtgDatosConsultados.Columns[0].Visibility = Visibility.Hidden;//FJRF - Ocultamos la columnas del codigo
        }
        #endregion

        protected void PttV_Imprimir()
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = MDOgeneral.StrRutaAplicacionReportes + "rptResumenDeCompras.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                //String StrRutaReporteAImprimir = @"C:\produccion\produccion\reportes\" + "rptResumenDeCompras.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - ImprimimosElReporte

                    DtImprimir = new DataTable("DtDatosReporte");
                    if (BooGridArmadoActual == false)//FJRF - Si no es el grid armado hacemos lo siguiente
                    {
                        DtImprimir = DtResumenDeCompras;//FJRF - Cargamos los datos
                    }
                    else//FJRF - Si es el grid armado hacemos lo siguiente
                    {
                        DtImprimir = DtResumenDeComprasArmado;//FJRF - Cargamos los datos
                    }
                    DtImprimir.TableName = "DtDatosReporte";

                    if (DtImprimir == null)//FJRF - Validamos que el reporte tenga datos para realizar el proceso de impresion
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                    }
                    else//FJRF - Si trae datos hacemos lo siguiente
                    {
                        CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                        DsImprimir = new DataSet("DsResumenDeCompras");//FJRF - DataSet que esta vinculado al CrystalReport

                        //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                        DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                        DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                        produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                        vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    }
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("NombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("TituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("CodigoProveedor", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("NombreProveedor", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("FechaInicial", System.Type.GetType("System.DateTime"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("FechaFinal", System.Type.GetType("System.DateTime"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["NombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["TituloReporte"] = "REPORTE RESUMEN DE COMPRAS";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["CodigoProveedor"] = CboCodigoProveedor.Text;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["NombreProveedor"] = CboNombreProveedor.Text;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["FechaInicial"] = DtpFechaInicial.SelectedDate.Value.ToShortDateString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["FechaFinal"] = DtpFechaFinal.SelectedDate.Value.ToShortDateString();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }
    }
}
